﻿#ifndef QSSLOADER_H
#define QSSLOADER_H

/**
加载 QSS 文件的工具类，采用单例模式设计，支持加载多个 QSS 文件并合并样式，同时提供样式热重载功能。

单例模式：全局唯一实例，方便在任何地方访问

多文件支持：可以加载多个QSS文件并自动合并

键值管理：为每个QSS文件指定key，方便单独移除

热重载支持：开发时可以监视文件变化自动重新加载

样式合并：自动合并所有加载的QSS内容

安全清理：提供清除所有样式或指定样式的功能
*/

#include <QString>
#include <QMap>
#include <QFile>
#include <QApplication>

class QSSLoader : public QObject
{
    Q_OBJECT
public:
    // 获取单例实例
    static QSSLoader& instance();

    // 禁用拷贝和赋值
    QSSLoader(const QSSLoader&) = delete;
    QSSLoader& operator=(const QSSLoader&) = delete;

    QString LoadStyleSheet(const QString& filePath);

    // 加载QSS文件并应用到应用程序
    bool load(const QString& filePath, const QString& key = "");

    // 移除已加载的QSS
    void remove(const QString& key);

    // 清空所有QSS样式
    void clear();

    // 获取当前所有QSS内容
    QString currentStyle() const;

    // 重新加载所有QSS文件（热重载）
    void reloadAll();

    // 设置监视文件变化（用于开发时热重载）
    void setWatchFiles(bool enable);

private:
    QSSLoader(QObject* parent = nullptr);
    ~QSSLoader();

    // 更新应用程序样式
    void updateApplicationStyle();

    // 监视文件变化
    void setupFileWatcher();
    void teardownFileWatcher();

    QMap<QString, QString> m_styleFiles;  // key-filePath映射
    QMap<QString, QString> m_styleSheets; // key-styleContent映射
    bool m_watchFiles = false;
    class QFileSystemWatcher* m_fileWatcher = nullptr;
};

#endif // QSSLOADER_H
